home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / UTIL / SCREEN / DIGI / !DigiClock / c / dclock next >
Text File  |  1994-04-29  |  8KB  |  340 lines

  1. /* This module provides the entire digital
  2.  * clock functionality.
  3.  */
  4.  
  5. #include <time.h>
  6. #include "wimp.h"
  7. #include "dclock.h"
  8. #include "win.h"
  9. #include "event.h"
  10. #include "wimp.h"
  11. #include "template.h"
  12. #include "h.bbc"
  13. #include "h.sprite"
  14. #include "h.resspr"
  15. #include <stdlib.h>
  16. #include <string.h>
  17.  
  18. void dclock_gettime(dclock_str *dclock)
  19.  
  20. {
  21.    struct tm *mytime;
  22.    time_t t;
  23.  
  24.    time(&t);
  25.    mytime=localtime(&t);
  26.  
  27.    dclock->initial_time=*mytime;
  28.  
  29.    dclock->et=360000*mytime->tm_hour+6000*mytime->tm_min+100*mytime->tm_sec;
  30. }
  31.  
  32. void sprite_name(char *str, int dig)
  33.  
  34. {
  35.    strcpy(str,"dig_");
  36.    str[4]=dig+'0';
  37.    str[5]='\0';
  38.  
  39. }
  40.  
  41. void dclock_display(wimp_redrawstr *redraw, dclock_str *dclock)
  42.  
  43. {
  44.    sprite_area *myarea=resspr_area();
  45.    sprite_pixtrans t[48];
  46.    sprite_factors f;
  47.    sprite_id id;
  48.    char name[13];
  49.    int xmin,xmax;
  50.    int et;
  51.  
  52.    et=dclock->et;
  53.  
  54.    id.tag=0;
  55.    id.s.name=name;
  56.  
  57.    xmin=redraw->g.x0-redraw->box.x0;
  58.    xmax=redraw->g.x1-redraw->box.x0;
  59.  
  60.    if (xmin<116) {
  61.       sprite_name(name,((et%8640000)/3600000)%3);
  62.       wimp_readpixtrans(myarea,&id,&f,t);
  63.       sprite_put_scaled(myarea,&id,0,redraw->box.x0,redraw->box.y0+dclock->old.hour1,&f,t);
  64.       if (dclock->old.hour1!=0) {
  65.          sprite_name(name,((((et+3600000)%8640000)/3600000))%3);
  66.          wimp_readpixtrans(myarea,&id,&f,t);
  67.          sprite_put_scaled(myarea,&id,0,redraw->box.x0,redraw->box.y0+dclock->old.hour1-136,&f,t);
  68.       }
  69.    }
  70.  
  71.    if (xmin<(116*2) && xmax>=116) {
  72.       sprite_name(name,((et/360000)%24)%10);
  73.       wimp_readpixtrans(myarea,&id,&f,t);
  74.       sprite_put_scaled(myarea,&id,0,redraw->box.x0+116,redraw->box.y0+dclock->old.hour0,&f,t);
  75.       if (dclock->old.hour0!=0) {
  76.          sprite_name(name,(((et/360000)+1)%24)%10);
  77.          wimp_readpixtrans(myarea,&id,&f,t);
  78.          sprite_put_scaled(myarea,&id,0,redraw->box.x0+116,redraw->box.y0+dclock->old.hour0-136,&f,t);
  79.       }
  80.    }
  81.  
  82.    if (xmin<(116*3) && xmax>=(116*2)) {
  83.       strcpy(name,"colon");
  84.       wimp_readpixtrans(myarea,&id,&f,t);
  85.       sprite_put_scaled(myarea,&id,0,redraw->box.x0+116*2,redraw->box.y0,&f,t);
  86.    }
  87.  
  88.    if (xmin<(116*4) && xmax>=(116*3)) {
  89.       sprite_name(name,(et/60000)%6);
  90.       wimp_readpixtrans(myarea,&id,&f,t);
  91.       sprite_put_scaled(myarea,&id,0,redraw->box.x0+116*3,redraw->box.y0+dclock->old.min1,&f,t);
  92.       if (dclock->old.min1!=0) {
  93.          sprite_name(name,((et/60000)+1)%6);
  94.          wimp_readpixtrans(myarea,&id,&f,t);
  95.          sprite_put_scaled(myarea,&id,0,redraw->box.x0+116*3,redraw->box.y0+dclock->old.min1-136,&f,t);
  96.       }
  97.    }
  98.  
  99.    if (xmin<(116*5) && xmax>=(116*4)) {
  100.       sprite_name(name,(et/6000)%10);
  101.       wimp_readpixtrans(myarea,&id,&f,t);
  102.       sprite_put_scaled(myarea,&id,0,redraw->box.x0+116*4,redraw->box.y0+dclock->old.min0,&f,t);
  103.       if (dclock->old.min0!=0) {
  104.          sprite_name(name,(et/6000+1)%10);
  105.          wimp_readpixtrans(myarea,&id,&f,t);
  106.          sprite_put_scaled(myarea,&id,0,redraw->box.x0+116*4,redraw->box.y0+dclock->old.min0-136,&f,t);
  107.       }
  108.    }
  109.  
  110.    if (xmin<(116*6) && xmax>=(116*5)) {
  111.       strcpy(name,"dot");
  112.       wimp_readpixtrans(myarea,&id,&f,t);
  113.       sprite_put_scaled(myarea,&id,0,redraw->box.x0+116*5,redraw->box.y0,&f,t);
  114.    }
  115.  
  116.    if (xmin<(116*7) && xmax>=(116*6)) {
  117.       sprite_name(name,(et/1000)%6);
  118.       wimp_readpixtrans(myarea,&id,&f,t);
  119.       sprite_put_scaled(myarea,&id,0,redraw->box.x0+116*6,redraw->box.y0+dclock->old.sec1,&f,t);
  120.       if (dclock->old.sec1!=0) {
  121.          sprite_name(name,(et/1000+1)%6);
  122.          wimp_readpixtrans(myarea,&id,&f,t);
  123.          sprite_put_scaled(myarea,&id,0,redraw->box.x0+116*6,redraw->box.y0+dclock->old.sec1-136,&f,t);
  124.       }
  125.    }
  126.  
  127.    if (xmin<(116*8) && xmax>=(116*7)) {
  128.       sprite_name(name,(et/100)%10);
  129.       wimp_readpixtrans(myarea,&id,&f,t);
  130.       sprite_put_scaled(myarea,&id,0,redraw->box.x0+116*7,redraw->box.y0+dclock->old.sec0,&f,t);
  131.       if (dclock->old.sec0!=0) {
  132.          sprite_name(name,(et/100+1)%10);
  133.          wimp_readpixtrans(myarea,&id,&f,t);
  134.          sprite_put_scaled(myarea,&id,0,redraw->box.x0+116*7,redraw->box.y0+dclock->old.sec0-136,&f,t);
  135.       }
  136.    }
  137. }
  138.  
  139. void dclock_handle_redraw(wimp_eventstr *event, dclock_str *dclock)
  140.  
  141. {
  142.    int flag=FALSE;
  143.    wimp_redrawstr redraw;
  144.  
  145.    redraw.w=event->data.o.w;
  146.    wimp_redraw_wind(&redraw,&flag);
  147.  
  148.    while(flag) {
  149.       dclock_display(&redraw,dclock);
  150.       wimp_get_rectangle(&redraw,&flag);
  151.    }
  152. }
  153.  
  154. void dclock_destroy(dclock_str *dclock)
  155.  
  156. {
  157.    wimp_delete_wind(dclock->handle);
  158.    win_activedec();
  159. }
  160.  
  161. void dclock_update(dclock_str *dclock, int no)
  162.  
  163. {
  164.    wimp_redrawstr r;
  165.    int flag;
  166.  
  167.    r.box.x0=no*116;
  168.    r.box.x1=no*116+116;
  169.    r.box.y0=-136;
  170.    r.box.y1=0;
  171.    r.w=dclock->handle;
  172.  
  173.    wimp_update_wind(&r,&flag);
  174.  
  175.    while(flag) {
  176.       dclock_display(&r,dclock);
  177.       wimp_get_rectangle(&r,&flag);
  178.    }
  179.  
  180. }
  181.  
  182. void dclock_handle_idle(dclock_str *dclock)
  183.  
  184. {
  185.     int et,ct,dt;
  186.     time_t t;
  187.     struct tm *hms;
  188.  
  189.     et=dclock->et;
  190.     time(&t);
  191.     hms=localtime(&t);
  192.     ct=360000*hms->tm_hour+6000*hms->tm_min+100*hms->tm_sec+(et%100);
  193.  
  194.     dt=ct-et+400;
  195.  
  196.     if (dt<=-4320000)
  197.         dt+=8640000;
  198.     else if (dt>=4320000)
  199.         dt-=8640000;
  200.     
  201.     if (dt>8000)
  202.         dt=8000;
  203.     else if (dt<-8000)
  204.         dt=-8000;
  205.     
  206.     et=(et*100+dt)/100;
  207.  
  208.     et=(et+8640000)%8640000;
  209.  
  210.     dclock->et=et;
  211.  
  212.         if ((et%100)>50)
  213.         {
  214.         dclock->new.sec0=((et%100-50)*30)/11;
  215.     }
  216.     else
  217.     {
  218.         dclock->new.sec0=0;
  219.     }
  220.  
  221.     if ((et%1000)>950)
  222.         dclock->new.sec1=((et%1000-950)*30)/11;
  223.     else
  224.          dclock->new.sec1=0;
  225.  
  226.     if ((et%6000)>5950)
  227.         dclock->new.min0=((et%6000-5950)*30)/11;
  228.     else
  229.     dclock->new.min0=0;
  230.  
  231.     if ((et%60000)>59950)
  232.         dclock->new.min1=((et%60000-59950)*30)/11;
  233.     else
  234.         dclock->new.min1=0;
  235.  
  236.     if ((et%360000)>359950)
  237.         dclock->new.hour0=((et%360000-359950)*30)/11;
  238.     else
  239.         dclock->new.hour0=0;
  240.  
  241.     if ((et%8640000)>8639950)
  242.         dclock->new.hour1=((et%8640000-863950)*30)/11;
  243.     else
  244.         dclock->new.hour1=0;    
  245.  
  246.     if ((et%3600000)>3599950)
  247.         dclock->new.hour1=((et%3600000-3599950)*30)/11;
  248.     else
  249.         dclock->new.hour1=0;
  250.  
  251.     if (dclock->new.sec0!=dclock->old.sec0 || dclock->val.sec0!=(et/100)) {
  252.         dclock->old.sec0=dclock->new.sec0;
  253.         dclock->val.sec0=et/100;
  254.         dclock_update(dclock,7);
  255.     }
  256.     else
  257.         return;
  258.  
  259.     if (dclock->new.sec1!=dclock->old.sec1 || dclock->val.sec1!=(et/1000)) {
  260.         dclock->old.sec1=dclock->new.sec1;
  261.         dclock->val.sec0=et/1000;
  262.         dclock_update(dclock,6);
  263.     }
  264.     else
  265.         return;
  266.  
  267.     if (dclock->new.min0!=dclock->old.min0 || dclock->val.min0!=(et/6000)) {
  268.         dclock->old.min0=dclock->new.min0;
  269.         dclock->val.min0=et/6000;
  270.         dclock_update(dclock,4);
  271.     }
  272.     else
  273.         return;
  274.  
  275.     if (dclock->new.min1!=dclock->old.min1 || dclock->val.min1!=(et/60000)) {
  276.         dclock->old.min1=dclock->new.min1;
  277.         dclock->val.min1=et/60000;
  278.         dclock_update(dclock,3);
  279.     }
  280.     else
  281.         return;
  282.  
  283.     if (dclock->new.hour0!=dclock->old.hour0 || dclock->val.hour0!=(et/360000)) {
  284.         dclock->old.hour0=dclock->new.hour0;
  285.         dclock->val.hour0=et/360000;
  286.         dclock_update(dclock,1);
  287.     }
  288.     else
  289.         return;
  290.  
  291.     if (dclock->new.hour1!=dclock->old.hour1 || dclock->val.hour1!=(et/3600000)) {
  292.         dclock->old.hour1=dclock->new.hour1;
  293.         dclock->val.hour1=et/3600000;
  294.         dclock_update(dclock,0);
  295.     }
  296.  
  297. }
  298.  
  299. void dclock_event_handler(wimp_eventstr *event, void *handle)
  300.  
  301. {
  302.    dclock_str *dclock=(dclock_str *) handle;
  303.  
  304.    switch(event->e) {
  305.       case wimp_ENULL:
  306.          dclock_handle_idle(dclock);
  307.          break;
  308.       case wimp_ECLOSE:
  309.          dclock_destroy(dclock);
  310.          break;
  311.       case wimp_EOPEN:
  312.          wimp_open_wind(&(event->data.o));
  313.          break;
  314.       case wimp_EREDRAW:
  315.          dclock_handle_redraw(event,dclock);
  316.          break;
  317.    }
  318. }
  319.  
  320. void dclock_create(dclock_str *dclock)
  321.  
  322. {
  323.    wimp_wstate state;
  324.    template *temp;
  325.  
  326.    temp=template_copy(template_find("clock"));
  327.    wimp_create_wind(&(temp->window),&(dclock->handle));
  328.    wimp_get_wind_state(dclock->handle,&state);
  329.    state.o.behind=-1;
  330.    wimp_open_wind(&state.o);
  331.  
  332.    win_register_event_handler(dclock->handle,&dclock_event_handler,(void *)dclock);
  333.    win_activeinc();
  334.    win_claim_idle_events(dclock->handle);
  335.    event_setmask(0);
  336.  
  337.    dclock_gettime(dclock);
  338.    dclock_handle_idle(dclock);
  339. }
  340.